package com.idanchuang.count.core.util.keyformat;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author Richard_yyf
 * @version 1.0 2021/5/27
 */
public class UserCountKeysFormatter {

    /**
     * 用户维度 简单计数器场景 key 格式
     * count:{bizCode.id}:{userCode}:{scene}
     */
    private static final String USER_SCENE_COUNT_KEY_FORMAT = "count:%s:%s:%s";

    /**
     * 用户维度 消息计数 key 格式
     * msg:{bizCode.id}:{userCode}:{scene}
     */
    private static final String USER_MSG_SET_KEY_FORMAT = "msg:%s:%s:%s";

    /**
     * 系统维度 消息计数 key 格式
     * msg:{bizCode.id}:sys:{scene}
     */
    private static final String SYS_MSG_SET_KEY_FORMAT = "msg:%s:sys:%s";

    /**
     * 用户最近一次 readAll 的时间
     * key for hashtable
     * msg read recently
     * rt:{bizCode.id}:{userCode}:{scene}
     */
    private static final String USER_RECENT_READ_TIME_KEY_FORMAT = "rt:%s:%s:%s";


    /**
     * 唯一ID
     * 幂等用
     */
    private static final String UID_KEY_FORMAT = "cs:uid:%s";

    public static String formatUidKey(String uid) {
        return String.format(UID_KEY_FORMAT, uid);
    }

    public static String formatUserSceneCountKey(Integer bizId, Integer userCode, String scene) {
        return String.format(USER_SCENE_COUNT_KEY_FORMAT, bizId, userCode, scene);
    }

    public static List<String> formatUserSceneCountKeyList(Integer bizId, Integer userCode, List<String> scenes) {
        return scenes.stream()
                .map(s -> formatUserSceneCountKey(bizId, userCode, s))
                .collect(Collectors.toList());
    }

    public static String formatUserMsgSetKey(Integer bizId, Integer userCode, String scene) {
        //  msg:{bizCode.id}:{userCode}:{scene}
        return String.format(USER_MSG_SET_KEY_FORMAT, bizId, userCode, scene);
    }

    public static String formatSysMsgSetKey(Integer bizId, String scene) {
        //  msg:{bizCode.id}:sys:{scene}
        return String.format(SYS_MSG_SET_KEY_FORMAT, bizId, scene);
    }

    public static String formatRecentReadTimeKey(Integer bizId, Integer userCode, String scene) {
        //  rt:{bizCode.id}:{userCode}:{scene}
        return String.format(USER_RECENT_READ_TIME_KEY_FORMAT, bizId, userCode, scene);
    }

}
